import qs from 'qs';
import { useUserStore } from '@/store';
import type { TUserInfo } from '@/api/user/type';

export type CustomRequestOptions = UniApp.RequestOptions & {
  query?: Record<string, any>;
} & IUniUploadFileOptions; // 添加uni.uploadFile参数类型

// 请求基地址
// 拦截器配置
const httpInterceptor = {
  // 拦截前触发
  invoke(options: CustomRequestOptions) {
    const baseURL = import.meta.env.VITE_APP_BASE_URL;
    console.log('打印***invoke', options);
    // 接口请求支持通过 query 参数配置 queryString
    if (options.method === 'GET' && options.data) {
      const queryStr = qs.stringify(options.data);
      if (options.url.includes('?')) {
        options.url += `&${queryStr}`;
      } else {
        options.url += `?${queryStr}`;
      }
      options.data = {};
    }
    // api 目前为 mock 接口，所以无需处理
    if (!options.url.startsWith('http')) {
      // 1. 非 http 开头需拼接地址
      options.url = baseURL + options.url;
    }
    // 2. 请求超时
    options.timeout = 10000; // 10s
    // 3. 添加小程序端请求头标识
    options.header = {
      platform: __UNI_PLATFORM__, // 可选值与 uniapp 定义的平台一致，告诉后台来源
      ...options.header
    };
    // 4. 添加 token 请求头标识
    const userStore = useUserStore();
    const { accessToken } = userStore.userInfo as TUserInfo;
    if (accessToken) {
      options.header.Authorization = `Bearer ${accessToken}`;
    }
    console.log('打印***options', options);
  }
};

export const requestInterceptor = {
  install() {
    // 拦截 request 请求
    uni.addInterceptor('request', httpInterceptor);
    // 拦截 uploadFile 文件上传
    uni.addInterceptor('uploadFile', httpInterceptor);
  }
};
